<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of CartManager
 *
 */
class PedidosManager {

// <editor-fold defaultstate="collapsed" desc="Atributos + Constantes">
    private static $instancia;
    private $cliente;
    private $fecha;
    private $fechaLimite;
    private $productos;
    private $estado;
    private $usuario;

    const CANT_MINIMA=1;

// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Constructor + Singleton">
    static public function getInstance() {
        if (!self::$instancia instanceof self) {
            self::$instancia = new self;
        }
        return self::$instancia;
    }

    public function __construct() {
        $usuario = sfContext::getInstance()->getUser()->getGuardUser();

        $this->setFecha(date('Y-m-d H:i'));
        $this->setUsuario($usuario);
    }

// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Propiedades">
    public function getDetalle() {
        if (!empty($this->productos)) {
            return $this->productos;
        }
        return false;
    }

    public function getCliente() {
        if (!empty($this->cliente)) {
            return $this->cliente;
        }
        return false;
    }

    public function getEstado() {
        if (!empty($this->estado)) {
            return $this->estado;
        }
        return false;
    }

    public function getUsuario() {
        if (!empty($this->usuario)) {
            return $this->usuario;
        }
        return false;
    }

    public function getFecha() {
        if (!empty($this->fecha)) {
            return $this->fecha;
        }
        return false;
    }

    public function getFechaLimite() {
        //if (!empty($this->fechaLimite)) {
            return $this->fechaLimite;
        //}
        //return null;
    }

    public function setCliente($cliente) {

        if (!empty($cliente)) {
            $this->cliente = $cliente;
            return $this->cliente;
        }
        return null;
    }

    public function setEstado($estado) {

        if (!empty($estado)) {
            $this->estado = $estado;
            return $this->estado;
        }
        return null;
    }

    public function setUsuario(sfGuardUser $usuario) {

        if (!empty($usuario)) {
            $this->usuario = $usuario;
            return $this->usuario;
        }
        return null;
    }

    public function setFecha($fecha) {

        if (!empty($fecha)) {
            $this->fecha = $fecha;
            return $this->fecha;
        }
        return null;
    }

    public function setFechaLimite($fechaLimite) {

        if (!empty($fechaLimite)) {
            $this->fechaLimite = $fechaLimite;
            return $this->fechaLimite;
        }
        return null;
    }

    public function setProductos(array $productos) {

        if (!empty($productos)) {
            $this->productos = $productos;
            return $this->productos;
        }
        return null;
    }

// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Funciones">

    public function agregarProducto($producto, $indice=null) {

        //Estructura del array
        //         => [talle]
        //         => [descripcion]
        //         => [cantidad]

        $pedido = sfContext::getInstance()->getUser()->getAttribute('pedido');

        !$this->estaVacio() ? $ultimoIndice = $this->ObtenerUltimoIndice() : $ultimoIndice = 0;

        if (!empty($producto)) {

            $i = $ultimoIndice + 1;
            $pedido[$i]["talle"] = $producto["pro_ped_talle"];
            $pedido[$i]["descripcion"] = $producto["pro_ped_descripcion"];
            if(!empty($producto["pro_ped_cantidad"])){
            $pedido[$i]["cantidad"] = $producto["pro_ped_cantidad"];
            }else{
                $pedido[$i]["cantidad"] = 1;
            }

            sfContext::getInstance()->getUser()->setAttribute('pedido', $pedido);

            return true;
        }

        if (!empty($indice)) {
            $cantActual = $pedido[$indice]["cantidad"];
            $pedido[$indice]["cantidad"] = intval($cantActual) + 1;

            sfContext::getInstance()->getUser()->setAttribute('pedido', $pedido);

            return true;
        }
        return false;
    }

    public function productoExiste(Productos $producto) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('pedido');

        if (!empty($carro)) {

            $art = $producto->getProArticulo();
            $talle = $producto->getProTalle();
            $existe = false;
            foreach ($carro as $i => $detalle) {

                if (($detalle["articulo"] == $art) && ($detalle["talle"] == $talle)) {
                    $indice = $i;
                    $talle = $i["talle"];
                    $articulo = $i["articulo"];
                    $existe = true;
                }
            }

            if ($existe == true) {
                /* $indice["articulo"] = $articulo;
                  $indice["talle"] = $talle;
                  var_dump($indice);exit(); */
                return $indice;
            }
        }
        return false;
    }

    public function ObtenerUltimoIndice() {
        $carro = sfContext::getInstance()->getUser()->getAttribute('pedido');

        foreach ($carro as $i => $detalle) {
            $indice = $i;
        }
        if (!empty($carro)) {
            return $indice;
        }
        return false;
    }

    public function eliminarProducto(Productos $producto) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('pedido');

        if (!empty($carro)) {

            if (!empty($producto)) {

                $indice = $this->productoExiste($producto);

                if ($indice != false) {

                    unset($carro[$indice]);
                    sfContext::getInstance()->getUser()->setAttribute('pedido', $carro);
                    //$carro[$producto->getProArticulo().'.'.$producto->getProTalle()]["cantidad"] = null;
                    return true;
                }
            }
            return false;
        }
    }

    public function eliminarCantProducto($indice) {

        $cantidad = self::CANT_MINIMA;
        $pedido = sfContext::getInstance()->getUser()->getAttribute('pedido');

        if (!empty($pedido)) {
            if (!empty($indice)) {

                $cant = $pedido[$indice]["cantidad"];
           //var_dump($cant);
                
                $cant -= $cantidad;
        //var_dump($cant);
                $pedido[$indice]["cantidad"] = $cant;
         
//var_dump($pedido[$indice]);
//exit();
                
                
                if ($cant == 0) {
                    unset($pedido[$indice]);
                }
            }
            sfContext::getInstance()->getUser()->setAttribute('pedido', $pedido);
            return true;
        }
        return false;
    }

    public function vaciarCarro() {
        sfContext::getInstance()->getUser()->setAttribute('pedido', null);
    }

    public function checkOut($form, $idPedido=null) {

        //$carro = sfContext::getInstance()->getUser()->getAttribute('pedido');
        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos
            $formValues = $form->getValues();
            //$idPedido = $formValues['ped_id'];
            $idCliente = $formValues['ped_cliente'];
            $fechaLimite = $formValues['ped_fecha_limite'];

            $this->setCliente($idCliente);
            $this->setFechaLimite($fechaLimite);

            $estado = 1;
            $this->setEstado($estado);
            //Se trata de una edicion
            if (!empty($idPedido)) {

                $pedidoExiste = PedidosPeer::existe($idPedido);

                //existe en BD?
                if ($pedidoExiste) {
                    $pedido = PedidosPeer::retrieveByPK($idPedido);

                    if (!empty($pedido)) {
                        //Borrar detalle compra
                        $detalle = DetallePedidosPeer::BorrarDetalleDePedido($idPedido);

                        //$ped = $form->save();
                        $pedido = $this->almacenarPedido($pedido);
                    
                        //if (!empty($ped)) {
                        $detalle = $this->almacenarDetalle($pedido);
                        //}
                    }
                }
            } else {

                //Guardar Pedido
                $pedido = $this->almacenarPedido();

                if (!empty($pedido)) {
                    $ultimoPedido = PedidosPeer::obtenerUltimoPedido();
                }

                if (!empty($ultimoPedido)) {
                    $detalle = $this->almacenarDetalle($ultimoPedido);
                    
                }
            }
            
            
            //si todo va bien guardamos los cambios
            $con->commit();
            return $ultimoPedido;
        } catch (PropelException $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollBack();
            return false;
            //devolvemos el error al depurador
            //throw $e;
        }

    }

    public function estaVacio() {
        $carro = sfContext::getInstance()->getUser()->getAttribute('pedido');

        if (empty($carro)) {
            return true;
        }
        return false;
    }

    public function almacenarPedido(Pedidos $pedido=null) {

        if (empty($pedido)) {
            $pedido = new Pedidos();
            $pedido->setPedFecha($this->getFecha()); //CprTotal($total);
            $pedido->setPedUsuario($this->getUsuario()->getId()); //CprProveedor($proveedor);
        }

        $pedido->setPedCliente($this->getCliente()); //CprNroFactura($nroFactura);
        $pedido->setPedFechaLimite($this->getFechaLimite()); //CprFecha($fecha);
        $pedido->setPedEstado($this->getEstado());

        $ped = $pedido->save();

        return $pedido;
    }

    public function almacenarDetalle($pedido) {

        $detallePedido = sfContext::getInstance()->getUser()->getAttribute('pedido');
        try {
            foreach ($detallePedido as $i => $detalle) {

                $talle = $detalle["talle"];
                $descripcion = $detalle["descripcion"];
                $cant = $detalle["cantidad"];

                //Guardar Detalle
                $detalle = new DetallePedidos();
                $detalle->setDetPedItem($i);
                $detalle->setDetPedCantidad($cant);
                $detalle->setDetPedTalle($talle);
                $detalle->setDetPedDescripcion($descripcion);
                $detalle->setDetPedPedido($pedido->getPedId());
                $det = $detalle->save();
            }
            return true;
        } catch (sfException $e) {
            return false;
        }
    }

    public function obtenerCantArticulos() {

        $carro = sfContext::getInstance()->getUser()->getAttribute('pedido');

        $contador = 0;
        foreach ($carro as $detalle) {
            $contador += 1;
        }

        return $contador;
    }

// </editor-fold>
}

?>
